A common code smell that can hinder the clarity of source code is making assignments within sub-expressions. This practice involves assigning a
value to a variable inside a larger expression, such as within a loop or a conditional statement.
This practice essentially gives a side-effect to a larger expression, thus making it less readable. This often leads to confusion and potential
errors.
Moreover, using chained assignments in declarations is also dangerous because one may accidentally create global variables. Consider the following
code snippet: let x = y = 1;
. If y
is not declared, it will be hoisted as global.
Exceptions
The rule does not raise issues for the following patterns:
- chained assignments:
a = b = c = 0;
- relational assignments:
(a = 0) != b
- sequential assignments:
a = 0, b = 1, c = 2
- assignments in lambda body:
() => a = 0
- conditional assignment idiom:
a || (a = 0)
- assignments in (do-)while conditions:
while (a = 0);